Les lanceurs de bureau sont des scripts au format Freedesktop avec une extension de fichier masqué, point desktop.

Si deux lanceurs de même nom se trouvent dans les deux localisations possibles, c'est la version du dossier personnel qui l'emporte …

Prérequis

Problématique des applications Java

exemples pratiques : ancestris et jdownloader2

dans les deux cas, des lanceurs de bureau sont fournis et correctement installés

lorsqu'on lit le code de programme du script lanceur, on s'aperçoit que l'icon associé à exec est lié à un script qui appelle un script qui appelle le programme java : unity n'associe pas le programme java en exécution avec le lanceur de bureau → est-ce un bug unity ou une mauvaise écriture du script lanceur ?

JDownloader2

Code de programme d'un script de lanceur de bureau qui fonctionne : l'icon lié au programme java s'affiche correctement lors de l'exécution …

#!/usr/bin/env xdg-open
[Desktop Entry]
Type=Application
Name=JDownloader 2
Exec=/bin/sh $HOME/jd2/JDownloader2
Icon=$HOME/jd2/.install4j/JDownloader2.png
Categories=Network;Application;

Ancestris

Code de programme d'un script de lanceur de bureau qui ne fonctionne pas : l'icon lié au programme java ne s'affiche pas !

[Desktop Entry]
Encoding=UTF-8
Name=Ancestris
Name[fr]=Ancestris – Programme de Généalogie
Comment=A graphical viewer and editor genealogy program.
Comment[fr]=Programme de généalogie respectant en tous points la norme gedcom.
Exec=ancestris
Icon=ancestris
Terminal=false
Type=Application
Categories=Office;X-Genealogy;

Le fichier de configuration du menu pour ancestris, /usr/share/menus/ancestris

?package(ancestris):needs="x11" section="Applications/Office" \
  title="ancestris" command="/usr/bin/ancestris" \
  icon="/usr/share/pixmaps/ancestris.xpm"

Le fichier de script /usr/bin/ancestris

#!/bin/bash
cd /usr/share/ancestris/bin/
sh ancestris "$@"

Le fichier de script java /usr/share/ancestris/bin/ancestris

#!/bin/sh

#
# resolve symlinks
#

PRG=$0

while [ -h "$PRG" ]; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null`
    if expr "$link" : '^/' 2> /dev/null >/dev/null; then
	PRG="$link"
    else
	PRG="`dirname "$PRG"`/$link"
    fi
done

progdir=`dirname "$PRG"`
APPNAME=`basename "$PRG"`

if [ -f "$progdir/../etc/$APPNAME".conf ] ; then
    . "$progdir/../etc/$APPNAME".conf
fi

# XXX does not correctly deal with spaces in non-userdir params
args=""

case "`uname`" in
    Darwin*)
        userdir="${default_mac_userdir}"
        ;;
    *)
        userdir="${default_userdir}"
        ;;
esac
while [ $# -gt 0 ] ; do
    case "$1" in
        --userdir) shift; if [ $# -gt 0 ] ; then userdir="$1"; fi
            ;;
        *) args="$args \"$1\""
            ;;
    esac
    shift
done

if [ -f "${userdir}/etc/$APPNAME".conf ] ; then
    . "${userdir}/etc/$APPNAME".conf
fi

if [ -n "$jdkhome" -a \! -d "$jdkhome" -a -d "$progdir/../$jdkhome" ]; then
    # #74333: permit jdkhome to be defined as relative to app dir
    jdkhome="$progdir/../$jdkhome"
fi

readClusters() {
  if [ -x /usr/ucb/echo ]; then
    echo=/usr/ucb/echo
  else
    echo=echo
  fi
  while read X; do
    if [ "$X" \!= "" ]; then
      $echo "$progdir/../$X"
    fi
  done
}

absolutize_paths() {
    while read path; do
        if [ -d "$path" ]; then
            (cd "$path" 2>/dev/null && pwd)
        else
            echo "$path"
        fi
    done
}

clusters=`(cat "$progdir/../etc/$APPNAME".clusters; echo) | readClusters | absolutize_paths | tr '\012' ':'`

if [ ! -z "$extra_clusters" ] ; then
    clusters="$clusters:$extra_clusters"
fi

nbexec=`echo "$progdir"/../platform*/lib/nbexec`

case "`uname`" in
    Darwin*)
        eval exec sh '"$nbexec"' \
            --jdkhome '"$jdkhome"' \
            -J-Dcom.apple.mrj.application.apple.menu.about.name='"$APPNAME"' \
            -J-Xdock:name='"$APPNAME"' \
            '"-J-Xdock:icon=$progdir/../../$APPNAME.icns"' \
            --clusters '"$clusters"' \
            --userdir '"${userdir}"' \
            ${default_options} \
            "$args"
        ;;
    *)  
       sh=sh
       # #73162: Ubuntu uses the ancient Bourne shell, which does not implement trap well.
       if [ -x /bin/bash ]
       then
           sh=/bin/bash
       fi
       eval exec $sh '"$nbexec"' \
            --jdkhome '"$jdkhome"' \
            --clusters '"$clusters"' \
            --userdir '"${userdir}"' \
            ${default_options} \
            "$args"
       exit 1
        ;;
esac

Un code de programme de lanceur de bureau qui fonctionnerait pour ancestris devrait modifier la ligne Exec de façon à pointer directement sur le programme java au lieu de passer par un script qui appelle un script qui appelle ….

[Desktop Entry]
Encoding=UTF-8
Name=Ancestris
Name[fr]=Ancestris – Programme de Généalogie
Comment=A graphical viewer and editor genealogy program.
Comment[fr]=Programme de généalogie respectant en tous points la norme gedcom.
Exec=sh /usr/share/ancestris/bin/ancestris
Icon=/usr/share/pixmaps/ancestris.xpm
Terminal=false
Type=Application
Categories=Office;X-Genealogy;